<?php
#+------------------------------------------------------------------
#| 我曾七次鄙视自己的灵魂:
#| 第一次,当它本可进取时，却故作谦卑；
#| 第二次,当它空虚时，用爱欲来填充；
#| 第三次,在困难和容易之间，它选择了容易；
#| 第四次,它犯了错，却借由别人也会犯错来宽慰自己；
#| 第五次,它自由软弱，却把它认为是生命的坚韧；
#| 第六次,当它鄙夷一张丑恶的嘴脸时，却不知那正是自己面具中的一副；
#| 第七次,它侧身于生活的污泥中虽不甘心，却又畏首畏尾。
#+------------------------------------------------------------------
#| Author:Janmas Cromwell <janmas-cromwell@outlook.com>
#+------------------------------------------------------------------
namespace app\common\lib\queue;

use app\common\model\BalanceLog;
use app\common\model\ShortUrlLog;
use app\user\model\User;
use think\facade\Db;
use think\facade\Log;
use think\facade\Queue;
use think\queue\Job;

/**
 * 存储短网址队列
 */
class SaveShortUrl
{

    public function fire(Job $job, $params)
    {
        echo ('开始执行') . PHP_EOL;
        /**
         * @var User $user
         */
        $user = \app\common\model\User::find($params['user_id']);
        $data = $params['data'];
        echo ('编号' . $data['short_code']) . PHP_EOL;

        try {
            $urlLog = ShortUrlLog::where('short_code', $data['short_code'])
                ->findOrEmpty();
            if (!$urlLog->isEmpty() && $urlLog->status != ShortUrlLog::STATUS_NORMAL) {
                $job->delete();
                return;
            }
            Db::startTrans();
            //url生成记录
            $shortUrlLog = ShortUrlLog::create($data);
            $data['id'] = $shortUrlLog->id;

            //用户扣钱
            $user->money = bcsub($user->money , $params['price']);
            $user->save();
            //流水记录
            BalanceLog::create([
                'user_id' => $user->id,
                'opera'   => BalanceLog::OPERASUB,
                'message' => '生成' . ShortUrlLog::$sceneMap[$data['scene']],
                'extra'   => json_encode($data)
            ]);

            Db::commit();
            //删除任务
            if ($shortUrlLog->scene !== ShortUrlLog::PERMANENT && $shortUrlLog->expire_time > 0) {
                Queue::later($shortUrlLog->expire_time-time(), OverdueShorturl::class, $shortUrlLog, 'OVERDUE_SHORTURL');
            }
            $job->delete();
            echo ('编号:' . $data['short_code'] . '任务结束，任务删除') . PHP_EOL;
        } catch (\Exception $exception) {
            Db::rollback();
            $message = $exception->getMessage();
            $file = $exception->getFile();
            $line = $exception->getLine();
            $time = date('Y-m-d H:i:s');
            $log = <<<LOG
$time
'--记录短网址生成日志失败--'
$message
$file:$line
任务已重新发布
LOG;

            Log::write($log);
            echo '异常了，' . $message . PHP_EOL;
            echo '重新发布,60s秒后执行' . PHP_EOL;
            $job->release(60); //$delay为延迟时间
        }
    }

    public function failed($data)
    {
        #TODO:给开发者发邮件 邮件类 待构建
    }
}
